package util;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * @author zhanglinfeng
 * @date create in 2024/3/12 15:13
 */
public class ObjectUtil {

    /**
     * 对象转换
     *
     * @param sourceObject 原对象
     * @param targetClass  目标对象class
     * @param <T>          目标对象class
     * @return T
     */
    public static <T> T convert(Object sourceObject, Class<T> targetClass) {
        Field[] sourceFields = sourceObject.getClass().getDeclaredFields();
        Field[] targetFields = targetClass.getDeclaredFields();
        T target = null;
        try {
            target = targetClass.getConstructor().newInstance();
        } catch (Exception e) {
            return target;
        }
        for (Field ft : targetFields) {
            //只处理private修饰的非static字段
            if (!Modifier.isPrivate(ft.getModifiers()) || Modifier.isStatic(ft.getModifiers())) {
                continue;
            }
            ft.setAccessible(true);
            for (Field fs : sourceFields) {
                //只处理private修饰的非static字段
                if (!Modifier.isPrivate(fs.getModifiers()) || Modifier.isStatic(fs.getModifiers())) {
                    continue;
                }
                fs.setAccessible(true);
                //字段名和字段类型一致
                if (ft.getName().equals(fs.getName()) && fs.getType().toString().equals(ft.getType().toString())) {
                    // 得到此属性的值
                    try {
                        ft.set(target, fs.get(sourceObject));
                    } catch (IllegalAccessException ignored) {
                    }
                    break;
                }
            }
        }
        return target;
    }

}
